package com.qf.service.impl;

import cn.hutool.core.lang.tree.Tree;
import cn.hutool.core.lang.tree.TreeNodeConfig;
import cn.hutool.core.lang.tree.TreeUtil;
import com.qf.entity.MdItemType;
import com.qf.entity.MdItemTypeVO;
import com.qf.mapper.MdItemTypeMapper;
import com.qf.service.MdItemTypeService;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;

/**
 * ==== 勤能补拙 ====
 *
 * @author dzz
 * @date 2025/4/21
 * <p>
 * ==== 行稳致远 进而有为 ====
 */
@Service
public class MdItemTypeServiceImpl implements MdItemTypeService {
   @Autowired
    private MdItemTypeMapper mdItemTypeMapper;

    /**
     * 第一种方法top1
     * 使用一个Sql，多表联查，实现封装，注意这是写死的层级
     * @return
     */
    @Override
    public List<MdItemTypeVO> getMdItemTypeTreeV1() {
        return mdItemTypeMapper.getMdItemTypeTreeV1();
    }

    /**
     * 第二种方法top2
     * 使用递归查询,动态获取多级分类的树形结构
     * @return
     */
    @Override
    public List<MdItemTypeVO> getMdItemTypeTreeV2() {
        //得到开始时的时间戳
        long start = System.currentTimeMillis();
        //先查顶级分类,ParentTypeId为0
        List<MdItemType> topItems = mdItemTypeMapper.getMdItemTypeByParentTypeId(0L);
        // 将顶级分类转换为 MdItemTypeVO，并递归查询子分类
        List<MdItemTypeVO> result = new ArrayList<>();
        // for (MdItemType topItem : topItems) {
        //     MdItemTypeVO vo = new MdItemTypeVO();
        //     try {
        //         // 属性拷贝
        //         BeanUtils.copyProperties(topItem, vo);
        //         // 递归查询子分类
        //         vo.setChildren(queryChildren(topItem.getItemTypeId()));
        //     } catch (Exception e) {
        //         e.printStackTrace();
        //     }
        //     result.add(vo);
        // }
        topItems.forEach(topItem -> {
            MdItemTypeVO vo = new MdItemTypeVO();
            try {
                // 属性拷贝
                BeanUtils.copyProperties(topItem, vo);
                // 递归查询子分类
                vo.setChildren(queryChildren(topItem.getItemTypeId()));
            } catch (Exception e) {
                e.printStackTrace();
            }
            result.add(vo);
        });
        long end = System.currentTimeMillis( );
        System.out.println("V2耗时:" + (end - start) + "毫秒");
        return result;
    }
    /**
     * 递归查询子分类
     *
     * @param parentId 父节点 ID
     * @return 子分类列表
     */
    private List<MdItemTypeVO> queryChildren(Long parentId) {
        // 查询当前父节点的子分类
        List<MdItemType> children = mdItemTypeMapper.getMdItemTypeByParentTypeId(parentId);
        List<MdItemTypeVO> result = new ArrayList<>();
        for (MdItemType child : children) {
            MdItemTypeVO vo = new MdItemTypeVO();
            try {
                // 属性拷贝
                BeanUtils.copyProperties(child, vo);
                // 递归查询子分类
                vo.setChildren(queryChildren(child.getItemTypeId()));
            } catch (Exception e) {
                e.printStackTrace();
            }
            result.add(vo);
        }
        return result;
    }

    /**
     * 将多表联查,拆出单表查询,再将结果封装!
     */
    // @Override
    // public List<MdItemTypeVO> getMdItemTypeTreeV222() {
    //
    //     ArrayList<MdItemTypeVO> list = new ArrayList<>( );
    //
    //     // 先查顶级分类,顶级固定是0
    //     List<MdItemTypeVO> topList = mdItemTypeMapper.getMdItemTypeByParentId(0L);
    //     // 遍历顶级分类
    //     topList.forEach(top -> {
    //         // 判断是否有子分类
    //         if (topList.isEmpty( )) {
    //             // 没有子分类,直接返回顶级分类
    //             MdItemTypeVO vo = new MdItemTypeVO( );
    //             // 属性拷贝
    //             BeanUtils.copyProperties(top, vo);
    //             list.add(vo);
    //         } else {// 有子分类,递归查询子分类
    //             // 查询二级子分类
    //             List<MdItemTypeVO> childList = mdItemTypeMapper.getMdItemTypeByParentId(top.getItemTypeId());
    //             childList.forEach(child -> {
    //                 // 查三级子分类
    //                 List<MdItemTypeVO> grandChildList = mdItemTypeMapper.getMdItemTypeByParentId(child.getItemTypeId( ));
    //                 if (grandChildList.isEmpty( )) {
    //                     MdItemTypeVO vo = new MdItemTypeVO( );
    //                     // 属性拷贝
    //                     BeanUtils.copyProperties(top, vo);
    //                     vo.setChildren(childList);
    //                     list.add(vo);
    //                 } else {
    //                     // 有子分类,递归查询子分类的子分类
    //                     grandChildList.forEach(grandChild -> {
    //                         // 查询四级子分类
    //                         List<MdItemTypeVO> mdItemTypeByParentId = mdItemTypeMapper.getMdItemTypeByParentId(grandChild.getItemTypeId( ));
    //                         //... 还有更多层级的子分类,继续递归查询
    //                     });
    //                 }
    //             });
    //         }
    //
    //     });
    //     return list;
    // }

    /**
     * 第三种方法top3
     * 使用Hutool工具类TreeUtil，实现封装,动态获取多级分类的树形结构
     * @return
     */
    @Override
    public List<Tree<String>> getMdItemTypeTreeV3() {
        long begin = System.currentTimeMillis( );
        // 查询全部的物料产品分类
        List<MdItemType> mdItemTypes = mdItemTypeMapper.selectAll();
        // 转换为TreeNode列表

        TreeNodeConfig treeNodeConfig = new TreeNodeConfig();
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        //转换器 (含义:找出父节点为字符串零的所有子节点, 并递归查找对应的子节点, 深度最多为 3)
        List<Tree<String>> treeNodes = TreeUtil.build(mdItemTypes, "0", treeNodeConfig,
                (treeNode, tree) -> {
                    tree.setId(treeNode.getItemTypeId().toString());
                    // 主键必须留着
                    tree.setParentId(treeNode.getParentTypeId().toString());
                    // 其他字段,需要自定义设置
                    tree.putExtra("orderNum", treeNode.getOrderNum());
                    tree.putExtra("itemTypeName", treeNode.getItemTypeName());
                    tree.putExtra("itemTypeId", treeNode.getItemTypeId());
                    tree.putExtra("itemTypeCode", treeNode.getItemTypeCode());
                    tree.putExtra("itemOrProduct", treeNode.getItemOrProduct());
                    tree.putExtra("enableFlag", treeNode.getEnableFlag());

                    tree.putExtra("createTime", format.format(treeNode.getCreateTime()));
                });
        long end = System.currentTimeMillis( );
        System.out.println("V3耗时:" + (end - begin) + "毫秒");
        return treeNodes;
    }

    @Override
    public int deleteMdItemTypeById(Integer id) {

        return mdItemTypeMapper.deleteMdItemTypeById(id);
    }

    @Override
    public int addItemType(MdItemType mdItemType) {
        return mdItemTypeMapper.addItemType(mdItemType);
    }

}

